import {
	phone,
	code,
	pwd,
	email,
	card,
	unifiedCard,
	number,
	userName,
	mainer,
} from "~/common/reg";
interface RegExpMap {
	// 手机号码
	phone: RegExp;
	// 六位数数字验证码
	code: RegExp;
	// 大写字母、小写字母、数字、特殊字符，至少由其中3种组成，长度必须在10至20位之间的密码
	pwd: RegExp;
	// 邮箱
	email: RegExp;
	// 身份证号
	card: RegExp;
	// 统一社会信用代码
	unifiedCard: RegExp;
	// 数字
	number: RegExp;
	// 1-10位由汉字或者字母组合的用户名
	userName: RegExp;
	// 18位主体证件号
	mainer: RegExp;
}

// 正则对象集合
const regExpObj: RegExpMap = {
	phone,
	code,
	pwd,
	email,
	card,
	unifiedCard,
	number,
	userName,
	mainer,
};

/**
 * 校验一个值是否满足对应正则检验结果，并返回对应的结果布尔值
 * @param value 校验值
 * @param type 校验正则类型，参照以上定义如果没有请自行补充
 */
export const checkValue = (value, type) => {
	try {
		return regExpObj[type].test(value);
	} catch {
		return false;
	}
};

// 小数位数
function decimalPlaces(num: number): number {
	const match = num.toString().match(/\.(\d+)?$/);
	if (!match) {
		return 0;
	}
	return match[1] ? match[1].length : 0;
}

/**
 * 数值范围验证
 * @param min 最小值
 * @param max 最大值
 * @param required 必填
 * @param fieldName 验证字段的字符串
 * @param precision 精度 默认2精度
 * @returns
 */
export const numRangeRuleValidator = function (
	min: number,
	max: number,
	required?: boolean,
	fieldName?: string,
	precision: number | boolean = 2
) {
	const _rej = (reason) => Promise.reject(reason);
	const _toStr = (v) => Object.prototype.toString.call(v);
	const _isNil = (o) => o === null || o === undefined;
	return function (_rule, value) {
		let _val = value;
		if (!required && _isNil(_val)) {
			return Promise.resolve();
		}
		if (required && _isNil(_val)) {
			return _rej(`请输入${fieldName || ""}`);
		}

		if (!_isNil(_val) && _toStr(value) === "[object String]") {
			_val = parseFloat(value);
		}
		if (_toStr(precision) === "[object Number]") {
			if (precision === 0 && decimalPlaces(value) > precision) {
				return _rej("请输入整数");
			} else if (
				typeof precision === "number" &&
				decimalPlaces(value) > precision
			) {
				return _rej(`小数保留${precision}位`);
			}
		}
		if (!_isNil(min) && _isNil(max) && _val < min) {
			return _rej(`不能小于${min}`);
		}
		if (!_isNil(max) && _isNil(min) && _val > max) {
			return _rej(`不能大于${max}`);
		}
		if (!_isNil(min) && !_isNil(max) && (_val < min || _val > max)) {
			return _rej(`请输入${min}-${max}`);
		}

		return Promise.resolve();
	};
};

// 校验富文本超链接
export const createRichLinksChecker = (whiteRegex?: RegExp) => {
	const whitelistRegex = whiteRegex || /(www\.[^\/]+\.gov\.cn)|(www\.zjzrzyjy\.com)/i;
	return (value) => {
		if (!value) { return true }
		const linkRegex = /<a\s+(?:[^>]*?\s+)?href="([^"]*)">.*?<\/a>/gi;
		const standaloneLinkRegex = /<(?:\w+)?[^>]*>(www\.[^\s<]+(?:\/[^\s<]+)?)<\/(?:\w+)?>|www\.[^\s<]+(?:\/[^\s<]+)?|(https?|ftp|file):\/\/[^\s<]+/gi;


		// 查找所有超链接
		const links = value.match(linkRegex) || [];
		const standaloneLinks = value.match(standaloneLinkRegex) || [];

		// 如果没有超链接，验证通过
		if (links.length === 0 && standaloneLinks.length === 0) {
			console.log("通过，没有超链接");
			return true;
		}

		// 验证<a>标签中的超链接
		for (const link of links) {
			const hrefMatch = link.match(/href="([^"]*)"/i);
			if (hrefMatch && hrefMatch[1]) {
				const href = hrefMatch[1];
				// 检查超链接是否在白名单中
				if (!whitelistRegex.test(href)) {
					console.log("失败：", href);
					return false;
				}
			}
		}

		// 验证不在<a>标签中的超链接
		for (const standaloneLink of standaloneLinks) {
			// 检查超链接是否在白名单中
			if (!whitelistRegex.test(standaloneLink)) {
				console.log("失败：", standaloneLink);
				return false;
			}
		}

		console.log("通过");
		return true;
	};
};
